package com.cskaoyan.javase.oop2._1extends._7initialization._3notice;

/**
 * 思考:
 *      1.当某个类做父类时,如果该类没有无参构造,那么它可以直接被继承吗?
 *          答案是不可以,因为子类对象的隐式初始化,要依赖于父类的无参构造
 *          所以在Java开发中 给一个类手动添加无参构造是一个好习惯,因为子类对象的隐式初始化需要依赖父类的无参构造
 *
 *      2.Object类是Java的顶层祖先类,那么Object是否存在无参构造呢?
 *      肯定是有的,因为子类对象的隐式初始化要依赖于父类的无参构造器
 *
 *      3.无论是子类对象的显示初始化还是子类对象的隐式初始化,最终都是为了保证:
 *          父类的构造器先于子类构造器执行
 *          但是创建子类对象时,虽然父类的构造器执行了,但是没有创建父类对象
 *          所以构造器的作用就有两点:
 *          a.创建自身对象时,给自身成员变量赋值(自己用)
 *          b.创建子类对象时,给自身成员变量赋值(给子类用)
 *
 *      4.super在构造器中可以使用super(参数)表示调用父类构造器
 *        this在构造器中可以使用this(参数)表示调用自身构造器
 *        但是不管是this还是super在表示调用构造器时,它们都必须在构造器的第一行
 *        所以this和super在表示调用构造器时,只能选择其一,不能都用.
 *
 *
 * @since 10:02
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
    }
}

class Father {
    int num;

    public Father(int num) {
        this.num = num;
    }
}
// There is no default constructor available in 'com.cskaoyan.javase.oop2._1extends._7initialization._3notice.Father'
// class Son extends Father{
// }

class Son2 extends Father {

    public Son2(int num) {
        // Call to 'super()' must be first statement in constructor body
        // System.out.println("");
        super(num);
    }
}

class Father2 {
    int num;

    public Father2() {
        // super();
    }

    public Father2(int num) {
        this();
        this.num = num;
    }
}

class Son extends Father2 {
    public Son() {
    }
}